<?php

namespace App\Models\System;

use App\Models\Trait\GetTableName;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Support\Collection;
use Laravel\Sanctum\HasApiTokens;

class Admin extends Authenticatable
{
    use GetTableName,HasApiTokens,HasFactory;

    protected $fillable = [
        'username',
        'email',
        'mobile',
        'password',
        'status',
        'nickname',
        'avatar',
    ];

    /**
     * @var array<int, string>
     */
    protected $hidden = [
        'password',
    ];

    /**
     * @return array<string, string>
     */
    protected function casts(): array
    {
        return [
            'mobile_verified_at' => 'datetime:Y-m-d H:i:s',
            'email_verified_at' => 'datetime:Y-m-d H:i:s',
            'created_at' => 'datetime:Y-m-d H:i:s',
            'updated_at' => 'datetime:Y-m-d H:i:s',
            'password' => 'hashed',
        ];
    }

    /**
     * 是否为超级管理员
     */
    protected function isSuperAdmin(): Attribute
    {
        return Attribute::make(
            get: fn (mixed $value, array $attributes) => $attributes['id'] == 1,
        );
    }

    /**
     * 增加默认头像
     */
    protected function avatar(): Attribute
    {
        return Attribute::make(
            get: fn (mixed $value) => $value ?? '/static/images/avatar.png',
        );
    }

    /**
     * 角色
     */
    public function roles()
    {
        return $this->belongsToMany(Role::class)->withTimestamps();
    }

    /**
     * 获取当前管理员拥有的角色id
     */
    public function getRolesIds(): Collection
    {
        // 如果是超级管理员 获取所有角色的id
        if ($this->is_super_admin) {
            return Role::query()->pluck('id');
        }

        // 获取当前用户的角色id
        return $this->roles()->pluck('id');
    }

    /**
     * 获取用户所有角色
     */
    public function getRoles()
    {
        // 如果是超级管理员 获取所有角色
        if ($this->is_super_admin) {
            return Role::query()->get();
        }

        // 获取当前用户的角色
        return $this->roles()->get();
    }

    /**
     * 获取当前用户所有菜单
     */
    public function getMenus(): Collection
    {
        // 如果是超级管理员 获取所有权限
        if ($this->is_super_admin) {
            return Menu::query()->get();
        }

        // 获取当前用户的权限
        return $this->roles()->with('menus')->get()->pluck('menus');
    }

    /**
     * 获取当前用户所有菜单的Code
     */
    public function getMenusCodes(): Collection
    {
        return $this->getMenus()->pluck('code');
    }

    /**
     * 获取当前用户所有菜单的id
     */
    public function getMenusIds(): Collection
    {
        return $this->getMenus()->pluck('id');
    }
}
